// 头文件包含了函数声明，宏定义，结构体声明，变量声明。
// 比如stdio.h系统头文件包含了printf，scanf, fopen函数
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>

// 第1优先级：各种括号，如()、[]等、成员运算符 . ；
// 第2优先级：所有单目运算符，如++(自加)、--(自减)、!(非)、~(位非)等；
// 第3优先级：乘法运算符*、除法运算符/、求余运算符%；
// 第4优先级：加法运算符+、减法运算符-；
// 第5优先级：移位运算符<<、>>；
// 第6优先级：大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=；
// 第7优先级：等于运算符==、不等于运算符!=；
// 第8优先级：按位与运算符&；
// 第9优先级：按位异或运算符^；
// 第10优先级：按位或运算符|；
// 第11优先级：逻辑与运算符&&；
// 第12优先级：逻辑或运算符||；
// 第13优先级：三目条件运算符 ?: ；
// 第14优先级：各种赋值运算符，如=、+=、-=、*=、/= 等；
// 第15优先级：逗号运算, 。

// 位与&:
// a	b	结果
// 0	0	0
// 0	1	0
// 1	0	0
// 1	1	1
// 总结：x&0=0, x&1=x.用法也就是把某个位配成0，而其他不变。
// 多位操作：
// 0b01010101
//   &&&&&&&&
// 0b11110000
//=0b01010000

// 位或|
// a	b	结果
// 0	0	0
// 0	1	1
// 1	0	1
// 1	1	1
// 总结：x|0=x, x|1=1.用法也就是把某个位配成1，而其他不变。
// 多位操作：
// 0b01010101
//   ||||||||
// 0b11110000
//=0b11110101

// 位非~
// a		结果
// 0		1
// 1		0
// 总结：~1=0,~0=1
// 多位操作：
// 0b01010101
// ~
//=0b10101010

// 位异或^
// a	b	结果
// 0	0	0
// 0	1	1
// 1	0	1
// 1	1	0
// 总结：x^0=x,x^y=y^x,x^x=0,x^y^x=x^x^y=y.主要用途交换，加密，等。
// 多位操作：
// 0b01010101
//   ^^^^^^^^
// 0b11110000
//=0b10100101

// int main(void)也是可以的
int main(int argc, char **argv)
{
    unsigned char valuea = 0x55, valueb = 0xf0, valuec;
    printf("[%s,%d]origin valuea=0x%x, valueb=0x%x\n", __FILE__, __LINE__, valuea, valueb);

    printf("[%s,%d]test & operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    valuea = valuea & valueb;
    printf("[%s,%d]& value=0x%x\n", __FILE__, __LINE__, valuea);

    valuea = 0x55, valueb = 0xf0;
    valuea &= valueb;
    printf("[%s,%d]& value=0x%x\n", __FILE__, __LINE__, valuea);

    printf("[%s,%d]test | operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]| value=0x%x\n", __FILE__, __LINE__, valuea | valueb);

    valuea = 0x55, valueb = 0xf0;
    valuea |= valueb;
    printf("[%s,%d]| value=0x%x\n", __FILE__, __LINE__, valuea);

    printf("[%s,%d]test ^ operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]^ value=0x%x\n", __FILE__, __LINE__, valuea ^ valueb);

    valuea = 0x55, valueb = 0xf0;
    valuea ^= valueb;
    printf("[%s,%d]^ value=0x%x\n", __FILE__, __LINE__, valuea);


    printf("[%s,%d]test ~ operation================>\n", __FILE__, __LINE__);
    valuea = 0xf0;
    printf("[%s,%d]value=0x%02x\n", __FILE__, __LINE__, (unsigned char)valuea);
    valuea = ~valuea;
    printf("[%s,%d]value=0x%02x\n", __FILE__, __LINE__, valuea);
    
    return 1;
}


